package seguranca;

import java.lang.reflect.Method;
import negocio.NegocioException;



public class ControleAutenticacao extends ProxyBase {
	
    private final static String MENSAGEM = "Usuario não autenticado ou tempo limite expirado.";
    private final static String NEGADO = "Usuario sem permissão de acesso. Contate do administrador.";
    private final static String[] METODOS_SEM_PROXY = {"get","set","limpar","equal","hashCode",
                                                       "inserirCliente","alterarCliente","autenticar",
                                                       "pesquisarSemProxy","autenticarCliente",
                                                       "solicitarReserva"
                                   };
    
    private Object objetoReal;
    
    public ControleAutenticacao(Object objeto) {
        objetoReal = objeto;
    }
	
	public String getMensagemAutenticacao() {
		return MENSAGEM; 
	}	

	public Object getObjetoReal() {
		return objetoReal;
	}

	public void setObjetoReal(Object objetoReal) {
		this.objetoReal = objetoReal;
	}
	
	private boolean validarMetodoSemProxy(Method metodo) {
		for (String np : METODOS_SEM_PROXY) {
			if (metodo.getName().contains(np)) {
				return false;
			}
		}
		return true;
	}

	public Object invoke(Object proxy, Method method, Object[] args) 
    		throws NegocioException {
		//1. Validar se o metodo e de NEGOCIO e se precisa de validaçãoo.
		// verificar a constante METODOS_SEM_PROXY que contem a coleção
		// de metodos sem gerenciamento.
		if (validarMetodoSemProxy(method)) {
			//2. Metodo precisa de autenticão e controle de segurança.
			//2.1 Validar se o usuario esta logado.
			validarUsuarioAutenticado();
			//2.2 Validação da regra do perfil.
			if (!getUsuarioAutenticado().getPerfil().temAcesso(
					objetoReal.getClass().toString(),method.getName())){
				throw new NegocioException(NEGADO);
			}
		}		
	    return executarMetodo(objetoReal,method,args);
    }	
}